﻿#pragma once
#ifndef WRWORKDOMAIN_H
#define WRWORKDOMAIN_H

#include <QMutex>
#include <QString>
#include "WRWorkEntity.h"
#include "WRWorkDaemon.h"
#include "../WRSoft-Utility/Structs/WRFlags.h"
#include "../WRSoft-Utility/Structs/WRObservers.h"

//声明工作会话。
class WRWorkSession;

//表示工作域。
class WRSOFT_WORKING_COMMON_CLASS WRWorkDomain : public WRWorkEntity
{
    friend class WRWorkDaemon;

public:
    //枚举工作域状态。
    enum Status
    {
        //工作域关闭状态。
        Closed	= 0,
        //工作域离线状态。
        Offline	= 1,
        //工作域在线状态。
        Online	= 2,
    };
    //表示状况监视者。
    class Watcher
    {
    public:
        //当工作域状态改变后调用此方法，如果为在线状态，则存在会话，否则会话为0。
        virtual void onChanged(WRWorkDomain* domain, Status status, WRWorkSession* session) = 0;
    };

private:
    //表示状态处理器集合。
    class Watchers : public WRObservers<Watcher>
    {
    private:
        Status m_status;
        WRWorkDomain* m_domain;
        WRWorkSession* m_session;

        //当指定的观察者添加后调用此方法。
        void onAdded(Watcher* watcher)
        {
            watcher->onChanged(m_domain, m_status, m_session);
        }

    public:
        //构造函数。
        Watchers(WRWorkDomain* domain)
        {
            m_domain = domain;
            m_status = WRWorkDomain::Closed;
            m_session = 0;
        }

        //获取当前状态。
        inline Status status(void) const
        {
            return m_status;
        }

        //当状态改变后调用此方法。
        void onChanged(Status status, WRWorkSession* session = 0);
    } *m_watchers;

    //所属工作程序。
    WRWorkDaemon* m_daemon;

    Q_DISABLE_COPY(WRWorkDomain)

protected:
    //当加载后执行相应的初始工作。
    virtual void onInit(void);
    //当删除前执行相应的清理工作。
    virtual void onFree(void);

    //当状态改变后调用此方法。
    inline void onChanged(Status status, WRWorkSession* session = 0)
    {
        m_watchers->onChanged(status, session);
    }

    //获取当前状态。
    inline Status status(void) const
    {
        return m_watchers->status();
    }

    //初始化工作域对象。
    WRWorkDomain(const WRWorkInformation& info, WRWorkDaemon* daemon);
    //清理当前对象所占用的相关资源。
    ~WRWorkDomain(void);

public:
    //添加对象引用。
    inline void addRef(void)
    {
        m_daemon->addRef();
    }
    //释放对象引用, 如果引用计数为0，则删除对象，返回True，否则返回False。
    inline bool release(void)
    {
        return m_daemon->release();
    }

    //获取当前域所属的工作进程。
    inline WRWorkDaemon* daemon(void) const
    {
        return m_daemon;
    }

    //添加观察者。
    inline void add(Watcher* watcher)
    {
        m_watchers->add(watcher);
    }
    //移除观察者。
    inline bool remove(Watcher* watcher)
    {
        return m_watchers->remove(watcher);
    }

    //启动工作域。
    virtual bool start(void) = 0;
    //关闭工作域。
    virtual void close(void) = 0;
};

namespace WRText
{
    //返回指定工作域状态的文本。
    WRSOFT_WORKING_COMMON_API QString toString(WRWorkDomain::Status value);
}

#endif // WRWORKDOMAIN_H
